package scales.xml.impl
import scales.xml._
import scales.utils.collection.Tree
final class TreeProxy( private[this] var _elem : Elem, private[this] val _builder : XmlBuilder){
@inline def elem = _elem
@inline def setElem( elem : Elem ) {
_elem = elem
}
@inline def builder = _builder
}
import scala.collection.mutable.ArrayBuffer
class TreeProxies( ){
import ScalesXml.xmlCBF
var rootTree : XmlTree = _
private[this] var _depth : Int = -1
private[this] var _proxies : Array[TreeProxy] = Array.ofDim[TreeProxy](50)
def proxyPath() : XmlPath = {
var d = _depth
val l = _current
val te = l.elem
val tcc = l.builder.result
var elems = Array.ofDim[Elem](if (d < 0) 0 else d)
while( d > 0 ) {
d -= 1
elems(d) = _proxies(d).elem
}
reuse
var p = noXmlPath
d = 0
while( d < elems.length ){
beginSub(elems(d), XmlBuilder())
p = addAndFocus(p, elems(d))
d += 1
}
p = addAndFocus(p, te, tcc)
p
}
def proxyRemoveAndUp() : TreeProxies = {
val nd = _depth - 1
if (_depth > 0) {
_current = _proxies( nd )
_current.builder.clear()
} else {
rootTree = null.asInstanceOf[XmlTree]
_current = null.asInstanceOf[TreeProxy]
}
if (nd > -2)
_depth = nd
else
_depth = -1
this
}
def reuse() : TreeProxies = {
_depth = -1
rootTree = null.asInstanceOf[XmlTree]
_current = null.asInstanceOf[TreeProxy]
this
}
private[this] var _size = 0
private[this] var _current : TreeProxy = _
def current = _current
def current_=( tp : TreeProxy ) {
_current = tp
}
def depth = _depth
def depth_= ( newDepth : Int ) { _depth = newDepth }
def proxy( depth : Int ) = _proxies( depth )
def addChild( i : XmlItem ) {
_current.builder.+=(i)
}
def elementEnd() {
val l = _current
val newTree = Tree(l.elem, l.builder.result)
if (_depth > 0) {
_depth -= 1
_current = _proxies( _depth )
_current.builder.+=(newTree)
} else {
rootTree = newTree
_depth -= 1
}
}
def beginSub( elem : Elem, builder : => XmlBuilder) {
_depth += 1
if (_depth == _proxies.length) {
val ar = Array.ofDim[TreeProxy]( _proxies.length * 2 )
Array.copy(_proxies, 0, ar, 0, _proxies.length)
_proxies = ar
}
if (_depth == _size) {
_current = new TreeProxy(elem, builder)
_proxies(_depth) = _current
_size +=1
} else {
_current = _proxies(_depth)
_current.setElem(elem)
_current.builder.clear()
}
}
def tree =
rootTree
}